﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using CppIDE.Core;
using Application = CppIDE.Core.Application;

namespace CppIDE.UI
{

    /// <summary>
    /// Egy osztály a megnyitott fájlok (FileTabPage) füleinek kezeléséhez.
    /// </summary>
    class FileTabControl : TabControl
    {

        /// <summary>
        /// Változás esetén ez hívódik meg. (Fül változtatás, új fül hozzáadása
        /// vagy fül eltávolítása/bezárása esetén.)
        /// </summary>
        public event EventHandler Change;

        /// <summary>
        /// Konstruktor, létrehoz egy új példányt.
        /// </summary>
        public FileTabControl()
        {
            ContextMenu = new ContextMenu();
            MenuItem close = new MenuItem("Bezárás");
            close.DefaultItem = true;
            close.Click += new EventHandler(CloseActive);
            ContextMenu.MenuItems.Add(close);
            Change += delegate(Object s, EventArgs a) { };
            Application.getInstance().ActiveProjectChange += new EventHandler(ActiveProjectChange);
        }

        /// <summary>
        /// Ha megváltozik az aktuális projekt ez hívódik meg.
        /// Bezárja az összes fület, ha nincs megnyitva projekt.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public void ActiveProjectChange(Object sender, EventArgs args)
        {
            if (!Application.getInstance().isProjectLoaded())
            {
                TabPages.Clear();
            }
        }

        /// <summary>
        /// Bezárja az aktív fület.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public void CloseActive(Object sender, EventArgs args)
        {
            CloseActive();
        }

        /// <summary>
        /// Bezárja az aktív fület.
        /// </summary>
        public void CloseActive()
        {
            if (SelectedTab == null) return;
            if (!SelectedTab.Saved)
            {
                DialogResult result = MessageBox.Show("Szeretné menteni a fájlt bezárás előtt?", "Fájl mentése", MessageBoxButtons.YesNoCancel);
                if (result == DialogResult.Cancel) return;
                if (result == DialogResult.Yes)
                {
                    if (!SelectedTab.save())
                    {
                        return;
                    }
                }
            }
            TabPages.Remove(SelectedTab);
            Change(this, null);
        }

        /// <summary>
        /// A kiválasztott (aktív) FileTabPage tulajdonság (lehet null is)
        /// </summary>
        /// <value>A kiválasztott (aktív) FileTabPage (lehet null is)</value>
        new public FileTabPage SelectedTab
        {
            get
            {
                return (FileTabPage)base.SelectedTab;
            }
            set
            {
                base.SelectedTab = value;
                Change(this, null);
            }
        }

        /// <summary>
        /// Aktiválja a megadott forrásfájlt: ha már meg van nyitva, odalapoz,
        /// ha még nincs, akkor megnyitja és odalapoz.
        /// </summary>
        /// <param name="file">az aktiválandó forrásfájl</param>
        /// <returns>a forrásfájlhoz tartozó FileTabPage</returns>
        public FileTabPage activate(SourceFile file)
        {
            foreach (TabPage tabPage in TabPages)
            {
                if (tabPage is FileTabPage)
                {
                    FileTabPage fileTabPage = tabPage as FileTabPage;
                    if (fileTabPage.File.Equals(file))
                    {
                        SelectedTab = fileTabPage;
                        return fileTabPage;
                    }
                }
            }
            FileTabPage tab = new FileTabPage(file);
            add(tab);
            SelectedTab = tab;
            tab.Focus();
            return tab;
        }

        /// <summary>
        /// Menti az összes megnyitott fájlt, ha szükséges.
        /// </summary>
        /// <returns>ha igaz, minden fájl mentve van</returns>
        public bool saveAll()
        {
            foreach (TabPage tabPage in TabPages)
            {
                if (tabPage is FileTabPage)
                {
                    FileTabPage fileTabPage = tabPage as FileTabPage;
                    fileTabPage.save();
                }
            }
            return isAllSaved();
        }

        /// <summary>
        /// Ha igaz, minden fájl mentve van.
        /// </summary>
        /// <returns>Ha igaz, minden fájl mentve van.</returns>
        public bool isAllSaved()
        {
            bool saved = true;
            foreach (TabPage tabPage in TabPages)
            {
                if (tabPage is FileTabPage)
                {
                    FileTabPage fileTabPage = tabPage as FileTabPage;
                    saved = saved && fileTabPage.Saved;
                }
            }
            return saved;
        }

        /// <summary>
        /// Hozzáadja a kapott FileTabPage-et.
        /// </summary>
        /// <param name="tab">a megjelenítendő FileTabPage</param>
        public void add(FileTabPage tab)
        {
            if (!TabPages.Contains(tab))
            {
                tab.SavedChange += new EventHandler(Change);
                TabPages.Add(tab);
            }
        }
    }

}
